#pragma once
#ifndef H_118F0F7C_A532_4837_8515_895C0E0650D1
#define H_118F0F7C_A532_4837_8515_895C0E0650D1

/***********************************************************************************************//**
*\n  @file       hardwares.h
*\n  @brief      硬件设备接口文件
*\n  @details
*\n -------------------------------------------------------------------------
*\n  文件说明：
*\n       1. 硬件设备接口文件
*\n       2. 定义硬件设备接口
*\n       3. C++设计，并提供C接口
*\n
*\n -------------------------------------------------------------------------
*\n  版本:   修改人:   修改日期:       描述:
*\n  V0.01   罗先能    2021.4.3      创建
*\n  V0.02   罗先能    2021.7.15     添加详细注释文档
*\n
***************************************************************************************************/

/**************************************************************************************************
* 头文件
***************************************************************************************************/
#include "vme.h"
#include "device_uart.hpp"


/**************************************************************************************************
* 宏定义、结构定义
***************************************************************************************************/
// 设备编号
typedef enum
{
	DEV_NO_GPIO38 = 0,
	DEV_NO_GPIO39,

	DEV_NO_RS485A,
	DEV_NO_RS485B,
	DEV_NO_RS232,

	DEV_NO_DNA,    // 密码验证

	DEV_NO_MAX,

} DEV_NO;


/**************************************************************************************************
* 全局变量声明、定义
***************************************************************************************************/


/**************************************************************************************************
* 私有变量声明、定义
***************************************************************************************************/


/**************************************************************************************************
* 私有函数声明、定义
***************************************************************************************************/


/**************************************************************************************************
* 全局函数声明、定义
***************************************************************************************************/
#ifdef __cplusplus
extern "C"
{
#endif

/*************************************************************************************//**
*\n 函数名称： HwOpen() / HwClose()
*\n 功能描述：
*\n            打开(关闭)硬件设备
*\n 输入参数：
*\n            DEV_NO id      : 设备编号
*\n            void* pHandle  : 设备句柄数据结构(每个设备不相同)
*\n 输出参数:
*\n
*\n 返 回 值:
*\n           0 成功; -1 失败; -n    错误码
*\n -----------------------------------------------------------------------------------
*\n  版本:   修改人:       修改日期:        描述:
*\n  V0.01 罗先能        2021.7.15     创建
*****************************************************************************************/
int HwOpen  (DEV_NO id, void* pHandle);
int HwClose (DEV_NO id, void* pHandle);

/*************************************************************************************//**
*\n 函数名称： HwLoad()
*\n 功能描述：
*\n            下载fpga的bit流文件到FPGA(专用)
*\n 输入参数：
*\n            DEV_NO id         : 设备编号
*\n            const char* pFile : 下载的FPGA文件（/path/fpga.bit）
*\n 输出参数:
*\n
*\n 返 回 值:
*\n           0 成功; -1 失败; -n    错误码
*\n -----------------------------------------------------------------------------------
*\n  版本:   修改人:       修改日期:        描述:
*\n  V0.01 罗先能        2021.7.15     创建
*****************************************************************************************/
int HwLoad  (DEV_NO id, const char* pFile);

/*************************************************************************************//**
*\n 函数名称： HwRead() / HwWrite()
*\n 功能描述：
*\n            从硬件设备读/写数据
*\n 输入参数：
*\n            DEV_NO id         : 设备编号
*\n            long offset       : 偏移地址
*\n            void *pBuf        : 数据buffer
*\n            long iSizeToRead  : 需要读出数据的长度（byte单位）
*\n            long iSizeToWrite : 需要写入数据长度（byte单位）
*\n 输出参数:
*\n
*\n 返 回 值:
*\n           实际读出/写入的数据bytes数;
*\n           -1 失败;
*\n           -n 错误码;
*\n -----------------------------------------------------------------------------------
*\n  版本:   修改人:       修改日期:        描述:
*\n  V0.01 罗先能        2021.7.15     创建
*****************************************************************************************/
int HwRead  (DEV_NO id, long offset,  void *pBuf, long iSizeToRead);
int HwWrite (DEV_NO id, long offset,  void *pBuf, long iSizeToWrite);

/*************************************************************************************//**
*\n 函数名称： HwIoctl()
*\n 功能描述：
*\n            控制设备的操作
*\n 输入参数：
*\n            DEV_NO id        : 设备编号
*\n            long cmd         : 控制命令
*\n            void *pBuf       : 控制数据（输入）
*\n            long *pSize      : 数据长度（输入）
*\n 输出参数:
*\n            void *pBuf       : 输出数据（输出）
*\n            long *pSize      : 数据长度（输出）
*\n
*\n 返 回 值:
*\n           0 成功; -1 失败; -n    错误码
*\n -----------------------------------------------------------------------------------
*\n  版本:   修改人:       修改日期:        描述:
*\n  V0.01 罗先能        2021.7.15     创建
*****************************************************************************************/
int HwIoctl (DEV_NO id, long cmd,  /*INOUT*/ void *pBuf, /*INOUT*/ long *pSize);

/*************************************************************************************//**
*\n 函数名称： HwLock()  / HwUnlock()
*\n 功能描述：
*\n            设备的锁 、开锁
*\n 输入参数：
*\n            DEV_NO id        : 设备编号
*\n 输出参数:
*\n
*\n 返 回 值:
*\n           0 成功; -1 失败; -n    错误码
*\n -----------------------------------------------------------------------------------
*\n  版本:   修改人:       修改日期:        描述:
*\n  V0.01 罗先能        2021.7.15     创建
*****************************************************************************************/
int HwLock  (DEV_NO id);
int HwUnlock(DEV_NO id);

/*************************************************************************************//**
*\n 函数名称： DevicesInit()
*\n 功能描述：
*\n            初始化全部设备（调用设备的初始化函数）
*\n 输入参数：
*\n 输出参数:
*\n
*\n 返 回 值:
*\n           0 成功; -1 失败; -n    错误码
*\n -----------------------------------------------------------------------------------
*\n  版本:   修改人:       修改日期:        描述:
*\n  V0.01 罗先能        2021.7.15     创建
*****************************************************************************************/
int DevicesInit();
// int HwInit(DEV_NO id);




#ifdef __cplusplus
}
#endif
#endif  // H_118F0F7C_A532_4837_8515_895C0E0650D1



